﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Web;
using System.Data;
using ASPNETVN.PORTAL.Components.Helpers;
using HtmlAgilityPack;

namespace WEATHER.Components
{
    public struct ProvinceStruct
    {
        public string Code;
        public string Name;

        public ProvinceStruct(string code, string name)
        {
            Code = code;
            Name = name;
        }
    }

    public class Province
    {
        public static ProvinceStruct GetProvince(string code)
        {
            return GetProvinceList().First(x => x.Code == code);
        }

        public static IList<ProvinceStruct> GetProvinceList()
        {
            IList<ProvinceStruct> collection = new List<ProvinceStruct>();
            collection.Add(new ProvinceStruct("/23/96", "An Giang"));
            collection.Add(new ProvinceStruct("/21/94", "Bình Định"));
            collection.Add(new ProvinceStruct("/19/80", "Bắc Giang"));
            collection.Add(new ProvinceStruct("/19/81", "Bắc Ninh"));
            collection.Add(new ProvinceStruct("/19/86", "Bắc cạn"));
            collection.Add(new ProvinceStruct("/21/39", "Bình Thuận"));
            collection.Add(new ProvinceStruct("/23/45", "Bình Dương"));
            collection.Add(new ProvinceStruct("/23/53", "Bến Tre"));
            collection.Add(new ProvinceStruct("/23/59", "Bạc Liêu"));
            collection.Add(new ProvinceStruct("/23/60", "Bình Phước"));
            collection.Add(new ProvinceStruct("/23/56", "Cần Thơ"));
            collection.Add(new ProvinceStruct("/23/74", "Cà Mau"));
            collection.Add(new ProvinceStruct("/19/83", "Cao Bằng"));
            collection.Add(new ProvinceStruct("/21/92", "Đà nẵng"));
            collection.Add(new ProvinceStruct("/18/70", "Điện Biên"));
            collection.Add(new ProvinceStruct("/22/71", "Đắk Nông"));
            collection.Add(new ProvinceStruct("/23/62", "Đồng Nai"));
            collection.Add(new ProvinceStruct("/22/42", "Đắk Lắk"));
            collection.Add(new ProvinceStruct("/22/43", "Đà Lạt"));
            collection.Add(new ProvinceStruct("/23/51", "Đồng Tháp"));
            collection.Add(new ProvinceStruct("/19/48", "Hải Dương"));
            collection.Add(new ProvinceStruct("/18/4", "Hòa Bình"));
            collection.Add(new ProvinceStruct("/20/28", "Hà Tĩnh"));
            collection.Add(new ProvinceStruct("/19/63", "Hưng Yên"));
            collection.Add(new ProvinceStruct("/23/54", "Hậu Giang"));
            collection.Add(new ProvinceStruct("/19/65", "Hà Tây"));
            collection.Add(new ProvinceStruct("/19/68", "Hà Giang"));
            collection.Add(new ProvinceStruct("/19/88", "Hải Phòng"));
            collection.Add(new ProvinceStruct("/23/73", "Kiên Giang"));
            collection.Add(new ProvinceStruct("/22/40", "Kon Tum"));
            collection.Add(new ProvinceStruct("/18/69", "Lào Cai"));
            collection.Add(new ProvinceStruct("/19/82", "Lạng Sơn"));
            collection.Add(new ProvinceStruct("/23/50", "Long An"));
            collection.Add(new ProvinceStruct("/18/127", "Lai Châu"));
            collection.Add(new ProvinceStruct("/21/100", "Ninh Thuận"));
            collection.Add(new ProvinceStruct("/19/64", "Nam Định"));
            collection.Add(new ProvinceStruct("/21/37", "Nha Trang"));
            collection.Add(new ProvinceStruct("/19/46", "Ninh Bình"));
            collection.Add(new ProvinceStruct("/19/49", "Phủ Lý"));
            collection.Add(new ProvinceStruct("/22/41", "Pleiku"));
            collection.Add(new ProvinceStruct("/21/99", "Phú Yên"));
            collection.Add(new ProvinceStruct("/21/119", "Quảng Nam"));
            collection.Add(new ProvinceStruct("/19/120", "Quảng Ninh"));
            collection.Add(new ProvinceStruct("/21/34", "Quảng Ngãi"));
            collection.Add(new ProvinceStruct("/20/29", "Quảng Bình"));
            collection.Add(new ProvinceStruct("/20/30", "Quảng Trị"));
            collection.Add(new ProvinceStruct("/23/57", "Sóc Trăng"));
            collection.Add(new ProvinceStruct("/18/78", "Sơn La"));
            collection.Add(new ProvinceStruct("/19/84", "Tuyên Quang"));
            collection.Add(new ProvinceStruct("/19/85", "Thái Nguyên"));
            collection.Add(new ProvinceStruct("/20/106", "Thanh Hóa"));
            collection.Add(new ProvinceStruct("/19/58", "T.P Hà Nội"));
            collection.Add(new ProvinceStruct("/23/66", "Tây Ninh"));
            collection.Add(new ProvinceStruct("/20/31", "Thừa Thiên Huế"));
            collection.Add(new ProvinceStruct("/23/52", "Tiền Giang"));
            collection.Add(new ProvinceStruct("/19/47", "Thái Bình"));
            collection.Add(new ProvinceStruct("/23/44", "T.P Hồ Chí Minh"));
            collection.Add(new ProvinceStruct("/19/76", "Việt Trì"));
            collection.Add(new ProvinceStruct("/19/77", "Vĩnh Phúc"));
            collection.Add(new ProvinceStruct("/23/61", "Vũng Tàu"));
            collection.Add(new ProvinceStruct("/20/111", "Vinh"));
            collection.Add(new ProvinceStruct("/23/95", "Vĩnh Long"));
            collection.Add(new ProvinceStruct("/18/87", "Yên Bái"));
            return collection;
        }

        /// <summary>
        /// Lấy thông tin thời tiết hiện tại của các thành phố, thị xã.
        /// </summary>
        /// <returns>String as Html</returns>
        public static string GetCurrentWeatherOnline(Guid moduleID)
        {
            string HtmlContent = "", OuterHtml = "", HtmlContentChanged = "";
            try
            {
                //Lấy dữ liệu từ database
                DataSet ds = Item.SelectTopBy_WeatherType(moduleID, "CurrentWeather", 1);
                if (ds.Tables[0].Rows.Count > 0)
                {
                    HtmlContent = ds.Tables[0].Rows[0]["HtmlContent"].ToString();
                    HtmlContentChanged = HttpUtility.HtmlDecode(ds.Tables[0].Rows[0]["HtmlContentChanged"].ToString());
                }

                //Lấy thông tin từ website http://www.nchmf.gov.vn/            
                HtmlWeb hw = new HtmlWeb();
                HtmlDocument doc = hw.Load("http://www.nchmf.gov.vn/website/vi-VN/43/Default.aspx");
                HtmlNodeCollection nc = doc.DocumentNode.SelectNodes("//*[@id='_ctl1__ctl5__ctl0_dl_thoitiethieitai']");
                if (nc != null)
                    OuterHtml = nc[0].OuterHtml;

                //Lưu vào database 
                if (HtmlContent == "" || HtmlContent != OuterHtml)
                {
                    Item item = new Item();
                    item.ModuleID = moduleID;
                    item.WeatherType = "CurrentWeather";
                    item.HtmlContent = OuterHtml;
                    item.CreatedDate = DateTime.Now;
                    item.CreatedBy = "weather@asp.net.vn";
                    item.Insert();
                    HtmlContent = OuterHtml;
                }
                else if (HtmlContentChanged != "")
                {
                    HtmlContent = HtmlContentChanged;
                }
            }
            catch (Exception)
            {
                DataSet ds = Item.SelectTopBy_WeatherType(moduleID, "CurrentWeather", 1);
                HtmlContent = ds.Tables[0].Rows[0]["HtmlContent"].ToString();
            }

            return HtmlContent;
        }

        public static string GetWeatherDetailOffline(Guid moduleID, string provinceCode, ref DateTime recent)
        {
            string result = "Không lấy được dữ liệu";
            recent = new DateTime(1900, 1, 1);
            DataSet ds = Item.SelectTopBy_WeatherType(moduleID, "ProvinceWeather" + provinceCode, 1);
            if (ds.Tables[0].Rows.Count > 0)
            {
                result = ds.Tables[0].Rows[0]["HtmlContent"].ToString();
                recent = DateTime.Parse(ds.Tables[0].Rows[0]["CreatedDate"].ToString());
            }
            return result;
        }

        /// <summary>
        /// Lấy thông tin chi tiết theo tỉnh thành.
        /// </summary>
        /// <param name="moduleID">ModuleID</param>
        /// <param name="provinceCode">Ký hiệu tỉnh thành</param>
        /// <returns>String as Html</returns>
        public static string GetWeatherDetailOnline(Guid moduleID, string provinceCode)
        {
            //Lấy dữ liệu từ database
            DateTime recent = new DateTime(1900, 1, 1);
            string htmlContent = GetWeatherDetailOffline(moduleID, provinceCode, ref recent);
            DateTime now = DateTime.Now;
            TimeSpan ts = now.Subtract(recent);
            if (ts.TotalMinutes >= 60)
            {
                try
                {
                    //Lấy thông tin từ website http://www.nchmf.gov.vn/                
                    string content = HtmlHelper.GetHtmlFromUrl("http://www.nchmf.gov.vn/website/vi-VN/62" + provinceCode + "/map/Default.aspx");
                    int begin = content.IndexOf("_ctl1__ctl0_ModulePane_199");
                    int end = content.Substring(begin).IndexOf("Table1") - 32;
                    content = content.Substring(begin, end);
                    HtmlDocument doc = new HtmlDocument();
                    doc.DocumentNode.InnerHtml = "<td id=" + content;

                    HtmlNodeCollection nc = doc.DocumentNode.SelectNodes("//*[@class='thanhpho_bgr thanhpho_ten']");
                    string nameCity = nc[0].InnerText;

                    nc = doc.DocumentNode.SelectNodes("//*[@class='left_ver_box']");
                    HtmlNode n = nc[0].NextSibling.NextSibling;
                    nc = n.ChildNodes[1].ChildNodes[1].ChildNodes[1].SelectNodes("//table");

                    string result;
                    switch (nc.Count)
                    {
                        case 15:
                            result = "<div class='NameCity'>" + nameCity.Substring(1) + "</div>"
                                     + "<br><div class='TitleProvinceWeather'>+ Dự báo thời tiết 3 ngày tới</div><br>"
                                     + nc[4].OuterHtml + "<br><div class='TitleProvinceWeather'>+ Số liệu lịch sử</div><br>" + nc[12].OuterHtml;
                            break;
                        case 16:
                            result = "<div class='NameCity'>" + nameCity.Substring(1) + "</div>"
                                     + "<br><div class='TitleProvinceWeather'>+ Dự báo thời tiết 3 ngày tới</div><br>"
                                     + nc[4].OuterHtml + "<br><div class='TitleProvinceWeather'>+ Số liệu lịch sử</div><br>" + nc[13].OuterHtml;
                            break;
                        case 22:
                            nc[4].Attributes.Add("class", "CurrentWeather");
                            result = "<div class='NameCity'>" + nameCity.Substring(1) + "</div><br>"
                                     + nc[4].OuterHtml + "<br><div class='TitleProvinceWeather'>+ Dự báo thời tiết 3 ngày tới</div><br>"
                                     + nc[11].OuterHtml + "<br><div class='TitleProvinceWeather'>+ Số liệu lịch sử</div><br>" + nc[19].OuterHtml;
                            break;
                        default:
                            nc[4].Attributes.Add("class", "CurrentWeather");
                            result = "<div class='NameCity'>" + nameCity.Substring(1) + "</div><br>"
                                     + nc[4].OuterHtml + "<br><div class='TitleProvinceWeather'>+ Dự báo thời tiết 3 ngày tới</div><br>"
                                     + nc[11].OuterHtml + "<br><div class='TitleProvinceWeather'>+ Số liệu lịch sử</div><br>" + nc[20].OuterHtml;
                            break;
                    }

                    result = HttpUtility.HtmlEncode(result);
                    //Lưu vào database 
                    if (htmlContent != result)
                    {
                        Item item = new Item();
                        item.ModuleID = moduleID;
                        item.Title = "Thời tiết các tỉnh thành: " + GetProvince(provinceCode).Name;
                        item.SubTitle = "";
                        item.WeatherType = "ProvinceWeather" + provinceCode;
                        item.HtmlContent = result;
                        item.CreatedDate = DateTime.Now;
                        item.CreatedBy = "weather@asp.net.vn";
                        item.Insert();
                        htmlContent = result;
                    }
                }
                catch (Exception)
                {

                }
            }
            return htmlContent;
        }
    }
}
